# 需求：打开注册A页面，完成以下操作
# 1).使用显式等待定位用户名输入框，如果元素存在（实际优化为“可见且可交互”），就输入admin
# 核心：显式等待是精准等待，仅对指定元素生效，比隐式等待更灵活、稳定

# 从time模块导入sleep函数，用于最后观察输入效果（非必需，仅辅助验证）
from time import sleep
# 从selenium库导入webdriver模块，用于创建浏览器驱动、控制浏览器
from selenium import webdriver
# 从selenium导入Keys类（此处未实际使用，保留原导入，可后续扩展）
from selenium.webdriver.common.keys import Keys
# 导入WebDriverWait类：显式等待的核心类，用于设置等待条件和超时时间
from selenium.webdriver.support.wait import WebDriverWait
# 导入By类：适配新版selenium，替代已弃用的find_element_by_*方法
from selenium.webdriver.common.by import By
# 导入expected_conditions（简写为EC）：提供常用等待条件（如元素可见、存在、可点击等）
from selenium.webdriver.support import expected_conditions as EC

# 1. 初始化并打开Chrome浏览器
# executable_path：指定ChromeDriver驱动的本地绝对路径（适配selenium3及以下版本）
# 驱动作用：建立Python代码与Chrome浏览器的通信桥梁，实现对浏览器的控制
driver = webdriver.Chrome(executable_path='D:/chrome_driver/chromedriver.exe')
# 注释：selenium4及以上版本推荐写法（无需手动指定驱动路径）
# 需提前安装 webdriver-manager 库（pip install webdriver-manager），自动匹配浏览器版本下载驱动
# driver = webdriver.Chrome() # 创建Chrome浏览器对象，后续通过该对象执行所有操作

# 放大浏览器窗口
# maximize_window()：将窗口调整为屏幕最大尺寸，避免元素因窗口过小被隐藏，提高定位稳定性
driver.maximize_window()

# 2. 访问目标页面（注册A页面）
# get()方法：接收完整网络URL，让浏览器加载并显示该网页
driver.get("http://121.43.169.97:8848/pageA.html")

# ---------------------- 核心操作：显式等待定位用户名输入框并输入admin ----------------------
# 方式1：使用WebDriverWait+lambda表达式（原代码思路，修复后）
# 初始化显式等待对象：
#   driver：关联的浏览器驱动对象
#   10：超时时间（最多等待10秒）
#   1：检测间隔时间（每1秒检查一次元素是否满足条件，默认0.5秒，此处自定义为1秒）
wait = WebDriverWait(driver, 10, 1)

# 等待并定位用户名输入框：
# until(lambda x: ...)：接收一个匿名函数，x等价于driver（浏览器驱动对象）
# 修复1：原定位器"userA"错误→应为"#userA"（CSS_SELECTOR中#表示id选择器，匹配id="userA"的元素）
# 修复2：替换已弃用的find_element_by_css_selector→使用find_element(By.CSS_SELECTOR, 定位器)
# 等待逻辑：10秒内每1秒检查一次，直到找到id为userA的元素，返回该元素；超时未找到则抛异常
username = wait.until(lambda x: x.find_element(By.CSS_SELECTOR, "#userA"))

# 向定位到的输入框输入"admin"
username.send_keys("admin")

# 方式2：使用WebDriverWait+EC条件（推荐写法，更简洁、可读性更高）
# 作用：等待元素“可见且可交互”（比仅“存在”更严谨，避免元素存在但不可输入的情况）
# 注释：如需使用方式2，可替换上面的lambda表达式部分，代码如下：
# username = wait.until(
#     EC.visibility_of_element_located((By.CSS_SELECTOR, "#userA"))  # 等待元素可见
# )
# username.send_keys("admin")

# 暂停3秒：仅用于观察输入效果（实际项目中可删除，显式等待已确保元素可交互）
sleep(3)

# 关闭浏览器并释放资源
# quit()：关闭所有浏览器窗口，终止驱动进程，彻底释放内存和端口资源
driver.quit()